home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 1
/
Atari Mega Archive - Volume 1.iso
/
language
/
modula.zoo
/
_defn_realinou.mod
< prev
next >
Wrap
Text File
|
1988-04-24
|
6KB
|
176 lines
IMPLEMENTATION MODULE RealInOut ;
FROM InOut IMPORT ReadString , WriteString ;
FROM SYSTEM IMPORT VAL ;
PROCEDURE exponentten( i : INTEGER ) : REAL ;
VAR x, w : REAL ;
expsign : BOOLEAN ;
BEGIN
x := 10.0 ; w := 1.0 ;
IF i < 0 THEN
expsign := TRUE ; i := - i
ELSE
expsign := FALSE
END ;
WHILE i > 0 DO
IF ODD( i ) THEN w := w * x END ;
x := x * x ;
i := i DIV 2
END ;
IF expsign THEN w := 1.0 / w END ;
RETURN w
END exponentten;
PROCEDURE RealToString(VAR S:ARRAY OF CHAR; real :REAL; N :CARDINAL ):BOOLEAN;
TYPE TrickRecord = RECORD
CASE : CARDINAL OF
0: r: REAL |
1: ch, cl: CARDINAL
END
END;
VAR
maxlength, minsize, index, lvar : CARDINAL ;
trick : TrickRecord ;
exp2, exp10 : INTEGER ;
eps : REAL ;
BEGIN
maxlength := HIGH( S ) ; index := 0 ;
IF real < 0.0 THEN
S[index] := '-' ; INC( index ) ;
real := - real ; minsize := 7 ;
ELSE
minsize := 6
END ;
IF (N < minsize) OR (maxlength <= N) THEN
RETURN FALSE
END ;
N := N - minsize ;
IF real = 0.0 THEN
S[index] := '0' ;
INC( index ) ;
S[index] := '.' ;
INC( index ) ;
FOR lvar := 1 TO N DO
S[index] := '0' ;
INC( index )
END ;
exp10 := 0 ;
ELSE
trick.r := real ;
exp2 := VAL( INTEGER, trick.ch DIV 128 ) - 127;
IF exp2 >= 0 THEN
exp10 := TRUNC(FLOAT(exp2) * 0.3)
ELSE
exp10 := - TRUNC(FLOAT(-exp2) * 0.3)
END;
eps := 0.5 * exponentten( 0 - VAL( INTEGER , N ) );
WHILE real * exponentten(-exp10) + eps < 1.0 DO DEC (exp10) END;
WHILE real * exponentten(-exp10) + eps >= 10.0 DO INC (exp10) END;
real := real * exponentten(-exp10) + eps (* Rundung *);
S[index] := CHR(ORD(TRUNC( real )) + 48 ) ;
INC( index ) ;
S[index] := '.' ;
INC( index ) ;
FOR lvar := 1 TO N DO
real := real - FLOAT (TRUNC (real));
real := real * 10.0;
S[index] := CHR(ORD(TRUNC( real )) + 48) ;
INC( index )
END
END;
S[index] := 'E' ;
INC( index ) ;
IF exp10 < 0 THEN S[index] := '-' ; exp10 := -exp10
ELSE S[index] := '+' END ;
INC( index ) ;
S[index] := CHR(ORD( exp10 DIV 10 ) + 48 ) ;
INC( index ) ;
S[index] := CHR(ORD( exp10 MOD 10 ) + 48 ) ;
INC( index ) ;
S[index] := 0C ;
RETURN TRUE
END RealToString;
PROCEDURE StringToReal( A : ARRAY OF CHAR ; VAR RES : REAL ) : BOOLEAN ;
VAR index : CARDINAL ;
exponent : INTEGER ;
mantisse , stelle: REAL ;
vorzeichen : BOOLEAN ;
exponentvorzeichen : BOOLEAN ;
BEGIN
A[HIGH(A)] := 0C ;
index := 0 ; exponent := 0 ;
vorzeichen := FALSE ;
exponentvorzeichen := FALSE ;
WHILE A[index] = ' ' DO INC( index ) END ;
IF (A[index] = '-') OR (A[index] = '+') THEN
vorzeichen := A[index] = '-' ; INC(index)
END ;
WHILE A[index] = ' ' DO INC( index ) END ;
mantisse := 0.0 ;
IF ( A[index] >= '0' ) AND ( A[index] <= '9' ) THEN
REPEAT
mantisse := mantisse * 10.0 + FLOAT(ORD( A[index] ) - 48) ;
INC( index )
UNTIL (A[index] < '0') OR (A[index] > '9')
ELSE
RETURN FALSE
END ;
IF A[index] ='.' THEN
INC( index ) ;
stelle := 0.1 ;
WHILE (A[index] >= '0') AND (A[index] <= '9') DO
mantisse := mantisse + FLOAT(ORD( A[index] ) - 48) * stelle ;
stelle := stelle * 1.0E-1 ;
INC( index )
END
END ;
IF A[index] = 'E' THEN
INC( index ) ;
IF (A[index] = '-') OR (A[index] = '+') THEN
exponentvorzeichen := A[index] = '-' ;
INC( index )
END ;
IF ( A[index] >= '0' ) AND ( A[index] <= '9' ) THEN
REPEAT
exponent := exponent * 10 + ORD(A[index]) - 48 ;
INC( index )
UNTIL (A[index] < '0') OR (A[index] > '9')
ELSE
RETURN FALSE
END
END ;
IF vorzeichen THEN mantisse := - mantisse END ;
IF exponentvorzeichen THEN exponent := - exponent END ;
RES := mantisse * exponentten( exponent ) ;
RETURN (( A[index] = 0C ) OR ( A[index] = ' ' ) OR ( A[index] = 13C ))
END StringToReal ;
PROCEDURE ReadReal( VAR real : REAL ) ;
VAR InputString : ARRAY [0..60] OF CHAR ;
TmpReal : REAL ;
BEGIN
ReadString( InputString ) ;
Done := StringToReal( InputString , TmpReal ) ;
IF Done THEN real := TmpReal
ELSE real := 0.0
END
END ReadReal ;
PROCEDURE WriteReal( real : REAL ; n : CARDINAL ) ;
VAR OutputString : ARRAY [0..60] OF CHAR ;
BEGIN
Done := RealToString( OutputString , real , n ) ;
IF Done THEN WriteString( OutputString )
ELSE WriteString( "Error in RealOutput ! " )
END
END WriteReal ;
END RealInOut .